HTTP报文

HTTP报文是HTTP应用程序之间发送的数据块。

这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。

这些报文在客户端、服务器和代理之间流动。

报文流

术语“流入”、“流出”、“上游”及“下游”都是用来描述报文方向的。

HTTP使用术语流入和流出来描述事务处理的方向,报文流入源端服务器,工作完成之后,会流回用户的Agent代理中。

HTTP报文会像河水一样流动,不管是请求报文还是响应报文,所有的报文都会向下游流动。

所有的报文发送者都在接收者的上游。

报文的组成部分

每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。它们由三部分组成:对报文进行描述的起始行、包含属性的首部块,以及可选的、包含数据的主体部分。

报文的语法

所有的报文都可以分为两类:请求报文和响应报文。请求报文会向web服务器请求一个动作。响应报文会将请求的结果返回给客户端。

请求报文格式:

1
2
3
4
<method> <request-URL> <version>
<headers>

<entity-body>

响应报文格式(只有起始行的语法有所不同)

1
2
3
4
<version> <status> <reason-phrase>
<headers>

<entity-body>

方法(method)

客户端希望服务器对资源执行的动作,是一个单独的词,比如GETHEADPOST

请求URL(request-URL)

所请求的资源路径。

版本(version)

报文所使用的HTTP版本。

版本格式类似于:

HTTP/<major>.<minor>

状态码(status-code)

由三位数字组成,描述了请求过程中发生的情况,每个状态码的第一位数字都用于描述状态的一般类别。

原因短语(reason-phase)

数字状态码的可读版本,包含行终止序列之前的所有文本。

首部(header)

可以有零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号,然后是一个可选的空格,接着是一个值,最后是一个CRLF(空行),表示首部列表的结束和实体主体部分的开始。

实体的主体部分(entity-body)

实体的主体部分包含一个由任意数据组成的数据块。

方法

安全方法

HTTP定义了一组被称为安全方法的方法。GETHEAD方法的HTTP请求都不会产生什么动作。

安全方法并不一定是什么动作都不执行的,使用安全方法的目的就是当使用可能引发某一动作的不安全方法时,允许HTTP应用程序开发者通知用户。

GET

GET是最常用的方法,通常用于请求服务器发送某个资源。

HEAD方法与GET方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。

PUT

GET从服务器读取文档相反,PUT方法会向服务器写入文档。

POST

POST方法起初是用来向服务器输入数据的,实际上,通常会用它来支持HTML的表单。

TRACE

客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的HTTP请求。TRACE方法允许客户端在最终将请求发送给服务器时,看看它变成什么样子了。

OPTION

OPTION方法请求Web服务器告知其支持的各种功能。可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法。

DELETE

顾名思义,DELETE方法所做的事情就是请服务器删除请求URL所指定的资源。

但是,客户端应用程序无法保证删除操作一定会被执行。

状态码

HTTP状态码被分成了五大类,可以总结如下:

1xx

信息性状态码。

2xx

成功状态码。

3xx

重定向状态码

4xx

客户端错误状态码

5xx

服务器错误状态码

关于状态码的详细内容:

首部

首部和方法配合工作,共同决定了客户端和服务器端能做什么事情。

在请求和响应报文中都可以使用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些。可以将首部分为五个主要的类型:

通用首部

这是客户端和服务器都可以使用的通用首部。可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能。

比如,Date首部就是一个通用首部,每一端都可以用它来说明构建报文的时间和日期。

请求首部

从名字中就可以看出,请求首部是请求报文特有的。它们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据。

响应首部

响应报文有自己的首部集,以便为客户端提供信息。

实体首部

实体首部指的是用于应对实体主体部分的首部。

比如,可以用实体首部来说明实体主体部分的数据类型。

扩展首部

扩展首部是非标准的首部,由应用程序开发者创建,但还未添加到已批准的HTTP规范中去。